package com.jxb.myshop.web.servlet;

import com.jxb.myshop.common.Constant;
import com.jxb.myshop.common.ResponseCode;
import com.jxb.myshop.common.ResponseResult;
import com.jxb.myshop.entity.User;
import com.jxb.myshop.services.UserServices;
import com.jxb.myshop.services.impl.UserServicesImpl;
import com.jxb.myshop.util.Base64Utils;
import com.jxb.myshop.util.StringUtil;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Base64;

@WebServlet("/user")
/**
 * @author: JXB
 * @Description:
 * @date: 2022/9/15 21:00
 * @param:  * @param null
 * @return: {@link null}
 * 注册servlet
 **/
public class UserController extends BaseController {
    private UserServices us = new UserServicesImpl();

    /**
     * 用户登录的方法,以及验证自动登录
     */
    public String login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        ResponseResult rr = us.doVerify(username,password);
        if (rr.getCode() == ResponseCode.SUCCESS.getCode()) {
            // 成功响应
            // 重定向 首页
            //保存用户登录数据到session中
            HttpSession session = req.getSession();
            session.setAttribute(Constant.SystemConstant.IS_LOGIN,rr.getData());
            // 判断用户是否设置了自动登录
            String auto = req.getParameter("auto");
            //前端多选框是没有value,所以这里,只需要判断
            // auto不是null或者""即可,因为多选单选,选中的默认值是on
            if (StringUtil.isNotNull(auto)) {
                //把用户的用户名和密码都存入在cookie
                // 因为cookie保存的账号和密码需要用到但是又不能给其他人看到
                // 所以选择编译与反编译，加密是没有解密的
                Cookie cookie = new Cookie(Constant.SystemConstant.AUTO_LOGIN, Base64Utils.encode(username + ":" + password));
                // 设置cookie的存活时间以及作用范围，并加入到resp中
                cookie.setMaxAge(60*60*24*14);
                cookie.setPath("/");
                resp.addCookie(cookie);
            }
            return Constant.Re.URL_REDIRECT + "/index.jsp";
        }else {
            //失败响应
            //4 转发登录页码或者重定向 首页
            req.setAttribute("rr",rr);
            return Constant.Re.URL_FORWARD + "/login.jsp";
        }
    }

    /**
     * 用户账户激活
     */
    public String activate(HttpServletRequest req, HttpServletResponse resp) {
        // 1.接收用户提交的参数
        String email = req.getParameter("e");
        String c = req.getParameter("c");
        // 2.通过访问业务层进行激活
        // 已经激活        激活失败/成功      没有此账户
        ResponseResult rr = us.doActive(email,c);
        // 把响应信息存放进request作用域中
        req.setAttribute("rr", rr);
        // 转发到message.jsp页面展示
        return Constant.Re.URL_FORWARD + "/message.jsp";

    }

    /**
     * @param req
     * @param resp
     * @return 用户注册
     */
    public String register(HttpServletRequest req, HttpServletResponse resp) {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        String gender = req.getParameter("gender");
        // 获取完前端数据封装进User
        User u = new User(username, password, email, gender);
        // 调用业务层的新增方法，返回布尔判断是否新增成功
        boolean flag = us.insertUser(u);
        if (flag) {
            // 注册成功，进入registerSuccess.jsp页面
            return Constant.Re.URL_FORWARD + "/registerSuccess.jsp";
        } else {
            // 注册失败，使用Session记录失败信息，重定向回注册页面
            req.getSession().setAttribute("register", "注册失败，请稍后再试");
            return Constant.Re.URL_REDIRECT + "/register.jsp";
        }
    }

    /**
     * @param req
     * @param resp
     * @return 检测用户的用户名
     */
    public String checkUsername(HttpServletRequest req, HttpServletResponse resp) {
        String username = req.getParameter("username");
        User u = us.getUserByName(username);
        if (u != null) {
            return Constant.Re.SUCCESS;
        } else {
            return Constant.Re.FAIL;
        }
    }
}
